home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 November: Tool Chest / Dev.CD Nov 98 TC.toast / Sample Code / Files / MoreIsBetter / MIB-Libraries / Sources / MoreAppearance.cp next >
Encoding:
Text File  |  1998-09-25  |  8.3 KB  |  381 lines  |  [TEXT/CWIE]

  1. /*
  2.     File:        MoreAppearance.cp
  3.  
  4.     Contains:    Appearance Manager wrapper functions
  5.  
  6.     Written by:    Pete Gontier (PCG)
  7.  
  8.     Copyright:    Copyright (c) 1998 Apple Computer, Inc.
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <5>     9/11/98    PCG     conditionalize calls to Appearance Manager 1.1 so they occur on
  13.                                     PowerPC only and add sanity checks for Appearance Manager
  14.                                     availability
  15.          <4>      9/4/98    PCG     theme drawing state functions call real APIs if present
  16.          <3>      9/1/98    PCG     clean up Gestalt cache logic; MoreGetThemeDrawingState inits
  17.                                     stateResult to NIL
  18.          <2>      9/1/98    PCG     add theme drawing state functions
  19.          <1>     6/16/98    PCG     initial checkin
  20. */
  21.  
  22.  
  23. #include "MorePrefix.h"
  24.  
  25. #include "MoreAppearance.h"
  26. #include "MoreQuickDraw.h"
  27.  
  28. #include <Appearance.h>
  29. #include <Gestalt.h>
  30. #include <MacMemory.h>
  31.  
  32. static long gAppearanceAttributes, gAppearanceVersion;
  33.  
  34. pascal long GetAppearanceVersion (void)
  35. {
  36.     //
  37.     //    Simply returns our cached variable. See InitMoreAppearance
  38.     //    for how this variable is initialized.
  39.     //
  40.  
  41.     return gAppearanceVersion;
  42. }
  43.  
  44. pascal Boolean HaveAppearance (void)
  45. {
  46.     //
  47.     //    Tests a bit in our cached variable and promotes it to a byte
  48.     //    indicating whether the Appearance APIs are present.
  49.     //
  50.  
  51.     return (gAppearanceAttributes & (1 << gestaltAppearanceExists)) != 0;
  52. }
  53.  
  54. pascal Boolean AppearanceInCompatibilityMode (void)
  55. {
  56.     //
  57.     //    Tests a bit in our cached variable and promotes it to a byte
  58.     //    indicating whether Appearance is running in compatibility mode.
  59.     //
  60.  
  61.     return (gAppearanceAttributes & (1 << gestaltAppearanceCompatMode)) != 0;
  62. }
  63.  
  64. pascal OSStatus InitMoreAppearance (void)
  65. {
  66.     //
  67.     //    Caches some Gestalt values so we don't have to keep calling Gestalt.
  68.     //    If Appearance is present, registers us as an Appearance-savvy app.
  69.     //    Second-guesses the version advertised by Gestalt.
  70.     //
  71.  
  72.     OSStatus err = Gestalt (gestaltAppearanceAttr,&gAppearanceAttributes);
  73.  
  74.     if (err == gestaltUndefSelectorErr)
  75.     {
  76.         gAppearanceAttributes = 0;
  77.         err = noErr;
  78.     }
  79.     else if (!err)
  80.     {
  81.         err = Gestalt (gestaltAppearanceVersion,&gAppearanceVersion);
  82.  
  83.         if (err == gestaltUndefSelectorErr)
  84.         {
  85.             gAppearanceVersion = 0x0100;
  86.             err = noErr;
  87.         }
  88.     }
  89.  
  90.     if (!err && HaveAppearance ( ))
  91.     {
  92.         //
  93.         //    Perform sanity checking for potential weak links.
  94.         //    Even though Gestalt claims a certain version of
  95.         //    Appearance is available, we still may not have
  96.         //    successfully resolved all weak links to it. So
  97.         //    we second-guess Gestalt's claim and fall back to
  98.         //    progressively less useful versions of Appearance.
  99.         //    This is not an extensible approach; Appearance
  100.         //    Manager 2.0 weak links might be unresolved and
  101.         //    this code would never know to check. Still, this
  102.         //    code is only for ADDITIONAL paranoia/safety, and
  103.         //    a new Appearance Manager will not render it
  104.         //    invalid, just a little less canonical.
  105.         //
  106.  
  107. #if TARGET_RT_MAC_CFM
  108.  
  109. #if TARGET_CPU_PPC
  110.  
  111.         if (gAppearanceVersion >= 0x0110 && !GetTheme)
  112.             gAppearanceVersion = 0x0101;
  113.  
  114. #endif // TARGET_CPU_PPC
  115.  
  116.         if (gAppearanceVersion >= 0x0101 && !DrawThemeModelessDialogFrame)
  117.             gAppearanceVersion = 0x0100;
  118.  
  119.         if (gAppearanceVersion >= 0x0100 && !RegisterAppearanceClient)
  120.         {
  121.             gAppearanceVersion        = 0;
  122.             gAppearanceAttributes    = 0;
  123.         }
  124.  
  125. #endif // TARGET_RT_MAC_CFM
  126.  
  127.         if (HaveAppearance ( ))
  128.             err = RegisterAppearanceClient ( );
  129.     }
  130.  
  131.     return err;
  132. }
  133.  
  134. #pragma mark -
  135.  
  136. struct MoreThemeDrawingStateTag
  137. {
  138.     //
  139.     //    stolen from
  140.     //        {CommonSystem}:Toolbox:ToolboxUtils:CommonUtilities:ColorPenState.c
  141.     //
  142.  
  143.     Boolean            colorPort;
  144.     Boolean            bkPatternIsValid;
  145.     RGBColor        foreColor;
  146.     RGBColor        backColor;
  147.     PenState        pen;
  148.     SInt16            textMode;
  149.     PixPatHandle    pnPixPat;
  150.     PixPatHandle    bkPixPat;
  151.     Pattern            bkPat;
  152.     UInt32            fgColor;
  153.     UInt32            bkColor;
  154. };
  155.  
  156. pascal OSStatus MoreGetThemeDrawingState (MoreThemeDrawingState *stateResult)
  157. {
  158.     //
  159.     //    mostly stolen from
  160.     //        {CommonSystem}:Toolbox:ToolboxUtils:CommonUtilities:ColorPenState.c
  161.     //
  162.  
  163.     *stateResult = nil;
  164.  
  165.     OSStatus err = noErr;
  166.  
  167. #if TARGET_CPU_PPC
  168.  
  169.     if (::GetAppearanceVersion ( ) >= 0x0110 && ::GetThemeDrawingState)
  170.         err = ::GetThemeDrawingState ((ThemeDrawingState *) stateResult);
  171.     else
  172.  
  173. #endif
  174.  
  175.     {
  176.         MoreThemeDrawingState state = MoreThemeDrawingState (::NewPtrClear (sizeof (*state)));
  177.  
  178.         if (!state)
  179.             err = ::MemError ( );
  180.         else
  181.         {
  182.             GrafPtr curPort;
  183.             
  184.             ::GetPort( &curPort );
  185.             
  186.             state->pnPixPat = nil;
  187.             state->bkPixPat = nil;
  188.  
  189.             state->colorPort = ::IsColorGrafPort( curPort );
  190.             
  191.             // Save the black and white information always
  192.             
  193.             state->bkPatternIsValid = true;
  194.             state->bkPat = curPort->bkPat;
  195.             state->bkColor = curPort->bkColor;
  196.             state->fgColor = curPort->fgColor;
  197.  
  198.             if ( state->colorPort )
  199.             {
  200.                 ::GetForeColor( &state->foreColor );
  201.                 ::GetBackColor( &state->backColor );
  202.                 
  203.                 //
  204.                 // If the pen pattern is not an old style pattern,
  205.                 // copy the handle. If it is an old style pattern,
  206.                 // GetPenState below will save the right thing.
  207.                 //
  208.  
  209.                 PixPatHandle    penPixPat = ((CGrafPtr)curPort)->pnPixPat;
  210.                 PixPatHandle    backPixPat = ((CGrafPtr)curPort)->bkPixPat;
  211.                 
  212.                 if ( penPixPat != NULL )
  213.                     if( (**penPixPat).patType != 0 )
  214.                         state->pnPixPat = penPixPat;
  215.  
  216.                 //
  217.                 // If the back pattern is not an old style pattern,
  218.                 // copy the handle, else get the old pattern into
  219.                 // bkPat for restoring that way.
  220.                 //
  221.                 
  222.                 if( backPixPat != NULL )
  223.                 {
  224.                     if ( (**backPixPat).patType != 0 )
  225.                         state->bkPixPat = backPixPat;
  226.                     else
  227.                         state->bkPat = *(PatPtr)(*(**backPixPat).patData);
  228.                     
  229.                     state->bkPatternIsValid = true;
  230.                 }
  231.                 else
  232.                 {
  233.                     state->bkPatternIsValid = false;
  234.                 }
  235.                 
  236.             }
  237.             
  238.             ::GetPenState( &state->pen );
  239.             state->textMode = curPort->txMode;
  240.  
  241.             *stateResult = state;
  242.         }
  243.     }
  244.  
  245.     return err;
  246. }
  247.  
  248. pascal OSStatus MoreNormalizeThemeDrawingState (void)
  249. {
  250.     //
  251.     //    mostly stolen from
  252.     //        {CommonSystem}:Toolbox:ToolboxUtils:CommonUtilities:ColorPenState.c
  253.     //
  254.  
  255.     OSStatus err = noErr;
  256.  
  257. #if TARGET_CPU_PPC
  258.  
  259.     if (::GetAppearanceVersion ( ) >= 0x0110 && ::NormalizeThemeDrawingState)
  260.         err = NormalizeThemeDrawingState ( );
  261.     else
  262.  
  263. #endif
  264.  
  265.     {
  266.         static Pattern    whitePat = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  267.         GrafPtr            curPort;
  268.         
  269.         ::GetPort( &curPort );
  270.         ::ForeColor( blackColor );
  271.         ::BackColor( whiteColor );
  272.         ::PenNormal ( );
  273.         ::BackPat( &whitePat );
  274.         ::TextMode( srcOr );
  275.     }
  276.  
  277.     return err;
  278. }
  279.  
  280. pascal OSStatus MoreSetThemeDrawingState (MoreThemeDrawingState state, Boolean disposeNow)
  281. {
  282.     //
  283.     //    mostly stolen from
  284.     //        {CommonSystem}:Toolbox:ToolboxUtils:CommonUtilities:ColorPenState.c
  285.     //    and
  286.     //        {CommonSystem}:Toolbox:Appearance:AppearanceCore:ThemeDrawingState.cp
  287.     //
  288.  
  289.     OSStatus err = noErr;
  290.  
  291.     if (!state)
  292.         err = paramErr;
  293.  
  294. #if TARGET_CPU_PPC
  295.  
  296.     else if (::GetAppearanceVersion ( ) >= 0x0110 && ::SetThemeDrawingState)
  297.         err = ::SetThemeDrawingState (ThemeDrawingState (state), disposeNow);
  298.  
  299. #endif
  300.  
  301.     else
  302.     {
  303.         GrafPtr curPort;
  304.         
  305.         ::GetPort( &curPort );
  306.  
  307.         ::SetPenState (&(state->pen));
  308.  
  309.         //
  310.         // If we saved color information, and this port is a
  311.         // color port, use the color stuff, else just use the
  312.         // black and white information.
  313.         //
  314.     
  315.         if ( ::IsColorGrafPort( curPort ) && state->colorPort )
  316.         {
  317.             ::RGBForeColor( &state->foreColor );
  318.             ::RGBBackColor( &state->backColor );
  319.  
  320.             if ( state->pnPixPat != NULL )
  321.                 ::PenPixPat( state->pnPixPat );
  322.             
  323.             if( state->bkPatternIsValid )
  324.             {
  325.                 if ( state->bkPixPat != NULL )
  326.                     ::BackPixPat( state->bkPixPat );
  327.                 else
  328.                     ::BackPat( &state->bkPat );
  329.             }
  330.         }
  331.         else
  332.         {
  333.             //
  334.             // back pattern is always valid for monochrome ports
  335.             //
  336.         
  337.             ::BackPat( &state->bkPat );
  338.             ::ForeColor( state->fgColor );
  339.             ::BackColor( state->bkColor );
  340.         }
  341.  
  342.         ::TextMode( state->textMode );
  343.  
  344.         if (disposeNow)
  345.         {
  346.             ::DisposePtr (Ptr (state));
  347.             err = ::MemError ( );
  348.         }
  349.     }
  350.  
  351.     return err;
  352. }
  353.  
  354. pascal OSStatus MoreDisposeThemeDrawingState (MoreThemeDrawingState state)
  355. {
  356.     //
  357.     //    mostly stolen from
  358.     //        {CommonSystem}:Toolbox:Appearance:AppearanceCore:ThemeDrawingState.cp
  359.     //
  360.  
  361.     OSStatus err = noErr;
  362.  
  363.     if (!state)
  364.         err = paramErr;
  365.  
  366. #if TARGET_CPU_PPC
  367.  
  368.     else if (::GetAppearanceVersion ( ) >= 0x0110 && ::DisposeThemeDrawingState)
  369.         err = ::DisposeThemeDrawingState (ThemeDrawingState (state));
  370.  
  371. #endif
  372.  
  373.     else
  374.     {
  375.         ::DisposePtr (Ptr (state));
  376.         err = ::MemError ( );
  377.     }
  378.  
  379.     return err;
  380. }
  381.